package k.service;

import k.HelperClazz;
import k.activiti.dto.TaskBean;
import k.activiti.dto.WorkFlow;
import k.activiti.service.EasyActService;
import k.dao.base.EmpDao;
import k.dao.base.EventDao;
import k.dto.Emp;
import k.dto.Event;
import k.dto.Org;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * Created by 王硕
 */
@Service
public class EventService {
    @Autowired
    private EventDao eventDao;
    @Autowired
    private EasyActService easyActService;//activiti-easyAct服务
    @Autowired
    private EmpDao empDao;


    @Transactional
    public void saveStartProcess(Event event) {
        if (HelperClazz.isEmpty(event.getEvent_id())){
            this.save(event);//新增事件
        }
        event.setEvent_id(eventDao.queryEvent().get(0).getEvent_id());
        this.startProcess(event);
        this.findTaskListByEmpId(event.getEmp_id().toString());
        WorkFlow workFlow = new WorkFlow();
        workFlow.setTaskId(this.easyActService.findTaskListByName(event.getEmp_id().toString()).get(0).getId());
        workFlow.setComment(event.getEvent_content());
        workFlow.setEmp_id(event.getEmp_id().toString());
        workFlow.setOutcome("上报");
        this.completeTask(workFlow);
    }

    /**
     * 本地新增event
     * @param event
     */
    @Transactional
    public void save(Event event) {
        eventDao.save(event);
    }
    @Transactional
    public Map startProcess(Event event) {
        Map<String, Object> variables = new HashMap<>();
        try {
//            variables = this.findAssigneeTask(null, Integer.parseInt(Yj_event.getEmpId()));
            //使用当前对象获取到流程定义的key（对象的名称就是流程定义的key）
            String key = Event.class.getSimpleName();
            /**
             * 获取当前任务的办理人，使用流程变量设置下一个任务的办理人
             * empId是流程变量的名称，
             * 获取的办理人是流程变量的值
             * (1)使用流程变量设置字符串（格式：Yj_event.id的形式），通过设置，让启动的流程（流程实例）关联业务
             *(2)使用正在执行对象表中的一个字段BUSINESS_KEY（Activiti提供的一个字段），让启动的流程（流程实例）关联业务
             */
            variables.put("assignee", event.getEmp_id());
            //格式：Yj_event.id的形式（使用流程变量）
            if (HelperClazz.isEmpty(event.getEvent_id())){
                event = eventDao.queryEvent().get(0);
            }
            String objId = key + "." + event.getEvent_id();
            variables.put("objId", objId);
            //使用流程定义的key，启动流程实例，同时设置流程变量，同时向正在执行的执行对象表中的字段BUSINESS_KEY添加业务数据，同时让流程关联业务
            easyActService.saveStartProcess(key, objId, variables);
            return variables;
        } catch (Exception e) {
            variables.put("状态", "流程启动未成功");
            return variables;
        }
    }
    /**
     * 使用empid查询个人任务
     * @Param
     * @date
     */
    public List<TaskBean> findTaskListByEmpId(String empId) {
        List<TaskBean> list = easyActService.findTaskListByName(empId);
        for (TaskBean t : list) {
            t.setObject(this.findYj_eventByTaskId(t.getId()));
        }
        return list;
    }
    /**
     * 使用任务id查询事件信息
     * Created by 王玉涛
     *
     * @Param
     * @date 2017/6/24 23:25
     */
    public Event findYj_eventByTaskId(String taskId) {
        String buniness_key = easyActService.findBuniness_keyByTaskId(taskId);
        //5：获取BUSINESS_KEY对应的主键ID，使用主键ID，查询事件对象（Yj_event.1）
        String id = "";
        if (StringUtils.isNotBlank(buniness_key)) {
            //截取字符串，取buniness_key小数点的第2个值
            id = buniness_key.split("\\.")[1];
        }
        //查询事件对象
        Event event = this.findOne(id);
        return event;
    }
    /**
     * 按照id查询事件
     */
    public Event findOne(String id) {
        Event yj_event = eventDao.getEventById(id);
        return yj_event;
    }

    @ResponseBody
    @RequestMapping("completeTask")
    public String completeTask(WorkFlow workFlow) {
        String empId = workFlow.getEmp_id();
        Emp emp = empDao.getEmpById(empId);//根据empId查询人员信息
        if ("执法完结".equals(workFlow.getOutcome())) {
            empId = HelperClazz.getEMP().getEmp_id().toString();
            workFlow.setEmp_id(HelperClazz.getEMP().getEmp_id().toString());
        }
        if("请选择".equals(workFlow.getEmp_id())){
            emp = HelperClazz.getEMP();
        }

        Map<String,Object> map = new HashMap();
        map = this.findAssigneeTask(workFlow.getOutcome(),emp);
        if (map==null){
            return "未找到下一步办理人";
        }
        easyActService.addComment(workFlow,HelperClazz.getEMP().getOrg_name()+ "_"+HelperClazz.getEMP().getEmp_name());//添加处理意见
        easyActService.saveSubmitTask(workFlow, map);
        return "success";
    }

    /**
     * 查询的办理人列表,根据任务连线，查询连线下一步任务的办理人
     * Created by 王玉涛
     *
     * @Param String outcome, Integer empId,String orgIds(多个orgId拼成的String串)
     * @date 2017/6/23 10:48
     */
    public Map<String, Object> findAssigneeTask(String outcome, Emp emp2) {//查询的办理人
        String empId = "";
        if(null == emp2){
            empId = "0";
        }else{
            empId = emp2.getEmp_id().toString();
        }

        String assignee = "";
        Emp emp = empDao.queryByEmp(empId);//根据empId查询人员信息
        HashMap<String, Object> map = new HashMap<>();
        List<String> assigneeList = new ArrayList<>();
        if (!StringUtils.isEmpty(outcome)) {
//            String way[] = outcome.split(":");
            if ("上报".equals(outcome)) {
                assignee = empDao.findSysEmpByOrgIdAndRole_id(emp.getOrg_id(), 2);
                map.put("assignee", assignee);
            }

            if ("派发执法".equals(outcome)) {
//                assignee = empDao.findSysEmpByOrgIdAndRole_id(emp.getOrg_id(), 3);
                map.put("assignee", empId);
            }
            if ("执法完结".equals(outcome)) {
                assignee = empDao.findSysEmpByOrgIdAndRole_id(HelperClazz.getEMP().getOrg_id(), 2);
                map.put("assignee", assignee);
                map.put("assigneeList", assigneeList);
            }

        } else if(HelperClazz.isEmpty(assignee)||HelperClazz.isEmpty(assigneeList)){
            return null;
        }

        return map;
    }


    /**
     * 使用empid查询组任务
     * Created by 王玉涛
     *
     * @Param
     * @date 2017/6/22 17:02
     */
    public List<TaskBean> findGroupList(Emp emp) {
        List<TaskBean> list = easyActService.findGroupList(emp.getEmp_id().toString());
        for (TaskBean t : list) {
            t.setObject(this.findYj_eventByTaskId(t.getId()));
        }
        return list;
    }
        /*
         *
         * @author 王玉涛
         * @Date 2018/4/14 19:26
         * @param
         * @return
         */
        public List<Emp> getEmps (String orgId){
            return empDao.getEmps(orgId);
        }
    public List<Event> queryAll(){
        return eventDao.queryAll();
    }
}
